package com.tecnoagrosoft.zafra.control.activity;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import com.tecnoagrosoft.zafra.control.activity.R;
import com.tecnoagrosoft.zafra.control.db.GenericManager;
import com.tecnoagrosoft.zafra.control.db.GestorDB;
import com.tecnoagrosoft.zafra.control.model.android.ItemsList;
import com.tecnoagrosoft.zafra.control.utils.AdaptadorList;
import com.tecnoagrosoft.zafra.control.utils.UtilsGeneric;


import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class PersonalActivity extends Activity {

	private int modo;
	private GestorDB gestorDB;
	private GenericManager gM;
	private Integer idPersonal = 0;
	private Cursor c;
	private int isVersion;
	//
	// Elementos de la vista
	//
	private EditText nombApel;
	private EditText telefono;
	private TextView textViewNom;
	private TextView textViewTel;
	private LinearLayout layoutHistorico;
	private ListView lista;

	private Button btnGuardar;
	private Button btnCancelar;
	private Button btnEditar;
	private boolean editar = true;
	DecimalFormat formateador = new DecimalFormat("#,###.###");

	@SuppressLint("SimpleDateFormat")
	final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_personal);

		Intent intent = getIntent();
		Bundle extra = intent.getExtras();

		if (extra == null)
			return;

		textViewNom = (TextView) findViewById(R.id.textViewNomP);
		textViewTel = (TextView) findViewById(R.id.textViewTelefono);

		nombApel = (EditText) findViewById(R.id.etNombApelPersonal);
		telefono = (EditText) findViewById(R.id.etTelefonoPersonal);
		layoutHistorico = (LinearLayout) findViewById(R.id.list_historico_p);

		btnGuardar = (Button) findViewById(R.id.btnSave);
		btnCancelar = (Button) findViewById(R.id.btnCancel);
		btnEditar = (Button) findViewById(R.id.btnEditar);

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);

		if (extra.containsKey("id")) {
			String[] columns = { "_id", "nombre_apellido", "telefono", "is_version" };

			idPersonal = extra.getInt("id");
			c = gM.getObjectById("personal", columns, idPersonal);
			isVersion = c.getInt(c.getColumnIndex("is_version"));
			onLoadRegistro(c);
			loadtable();
			c.close();
		}

		gM.close();
		db.close();
		gestorDB.close();

		establecerModo(extra.getInt("modo"));

		btnGuardar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				save();
			}
		});

		btnCancelar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				cancel();
			}
		});

		btnEditar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				if (editar == true) {
					establecerModo(GestorDB.C_EDITAR);
					textViewNom.setText(getString(R.string.nombApel));
					textViewTel.setText(getString(R.string.telefono));

					nombApel.setVisibility(View.VISIBLE);
					telefono.setVisibility(View.VISIBLE);

					btnGuardar.setVisibility(View.VISIBLE);
					btnCancelar.setVisibility(View.VISIBLE);
					btnEditar.setText(getString(R.string.mode_lecture));
					editar = false;
				} else {
					btnEditar.setText(getString(R.string.edit));
					textViewNom.setText(getString(R.string.nombApel) + ": " + nombApel.getText().toString());
					textViewTel.setText(getString(R.string.telefono) + ": " + telefono.getText().toString());

					nombApel.setVisibility(View.GONE);
					telefono.setVisibility(View.GONE);

					btnGuardar.setVisibility(View.GONE);
					btnCancelar.setVisibility(View.GONE);

					editar = true;
				}

			}
		});

	}

	

	

	/**
	 * carga de registro
	 * 
	 * @param cursor
	 * @return
	 */
	private boolean onLoadRegistro(Cursor cursor) {
		boolean ok = true;

		nombApel.setText(cursor.getString(cursor.getColumnIndex("nombre_apellido")));
		telefono.setText(cursor.getString(cursor.getColumnIndex("telefono")));

		return ok;

	}

	/**
	 * establece le modo
	 * 
	 * @param m
	 */

	private void establecerModo(int m) {
		this.modo = m;

		if (modo == GestorDB.C_VISUALIZAR) {
			textViewNom.setText(getString(R.string.nombApel) + ": " + nombApel.getText().toString());
			textViewTel.setText(getString(R.string.telefono) + ": " + telefono.getText().toString());

			nombApel.setVisibility(View.GONE);
			telefono.setVisibility(View.GONE);

			btnGuardar.setVisibility(View.GONE);
			btnCancelar.setVisibility(View.GONE);

			this.setTitle(nombApel.getText().toString());
			this.setEdicion(false);

		} else if (modo == GestorDB.C_CREAR) {
			btnEditar.setVisibility(View.GONE);
			this.setTitle(getString(R.string.men_personal_establecerModo_nuevoPersonal));
			this.setEdicion(true);
		} else if (modo == GestorDB.C_EDITAR) {
			this.setTitle(getString(R.string.men_personal_establecerModo_editarPersonal) + ": " + nombApel.getText().toString());
			this.setEdicion(true);

		}
	}

	/**
	 * visualiza la vista si es editar
	 * 
	 * @param opcion
	 */
	private void setEdicion(boolean opcion) {
		nombApel.setEnabled(opcion);
		telefono.setEnabled(opcion);
		layoutHistorico.setEnabled(opcion);

		// Controlamos visibilidad de botonera
		LinearLayout v = (LinearLayout) findViewById(R.id.botoneraPersonal);

		if (opcion)
			v.setVisibility(View.VISIBLE);

		else
			v.setVisibility(View.GONE);
	}

	/**
	 * Metodo que inserta o actualiza segun sea la accion
	 */
	private void save() {

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		gM = new GenericManager(db);
		ContentValues reg = new ContentValues();

		String[] columnsU = { "_id", "nombre", "usuario", "activo", "pass", "apellido", "is_delete" };
		// se valida si el usuario relizo la primera sincronizacion
		Cursor cu = gM.getObjectWhere("usuario", columnsU, "activo = 1 and sincro is null and is_delete = 0");
		if (cu.moveToFirst()) {
			Toast.makeText(PersonalActivity.this, R.string.men_no_sincronizado, Toast.LENGTH_SHORT).show();
		} else {
			
			if (validadorCammpo()){

				if (modo == GestorDB.C_EDITAR)
					reg.put("_id", idPersonal);

				reg.put("nombre_apellido", nombApel.getText().toString());
				reg.put("telefono", telefono.getText().toString());
				reg.put("is_delete", 0);

				if (modo == GestorDB.C_CREAR) {
					reg.put("is_version", 1);
					gM.insertObject("personal", reg);
					Toast.makeText(PersonalActivity.this, R.string.men_new, Toast.LENGTH_SHORT).show();
				} else if (modo == GestorDB.C_EDITAR) {
					reg.put("is_version", isVersion + 1);
					update("personal", reg, idPersonal);
					Toast.makeText(PersonalActivity.this, R.string.men_update, Toast.LENGTH_SHORT).show();

				}
				setResult(RESULT_OK);
				finish();
			}
		}
		gM.close();
		db.close();
		gestorDB.close();

	}

	/**
	 * valida los campos
	 * @return
	 */
	private boolean validadorCammpo() {
		View focusView = null;
		boolean error = false;
		boolean cancel = false;
		nombApel.setError(null);
		telefono.setError(null);

		focusView = UtilsGeneric.validator(nombApel, 2, 30, PersonalActivity.this);
		if (focusView != null){
			focusView.requestFocus();
		}
		focusView = UtilsGeneric.validator(telefono, 1, 20, PersonalActivity.this);
		if (focusView != null){
			focusView.requestFocus();
		}
		if(!error){
			cancel = true;
		}
		return cancel;
	}

	/**
	 * Metodo para cancelar la accion
	 */
	private void cancel() {

		setResult(RESULT_CANCELED, null);
		finish();

	}

	

	/**
	 * carga la lista de parcelas en listview
	 */
	private void loadtable() {

		ArrayList<ItemsList> datos = new ArrayList<ItemsList>();

		gestorDB = new GestorDB(PersonalActivity.this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();
		GenericManager gM = new GenericManager(db);

		String[] columns = { "_id", "aplicacion_id", "personal_id", "jornal", "horas_hombre", "fecha_creacion" };
		String[] columnsApli = { "_id", "aplicacion_tipo_id" };

		Cursor c = gM.getObjectWhere("trabajo", columns, "personal_id=" + idPersonal);
		String descripcion = "";
		DateFormat dfMostrar = DateFormat.getDateInstance(DateFormat.FULL);

		Date fechaCreacion = null;
		Long jornal, horas = (long) 0;
		if (c.moveToFirst()) {

			do {
				try {

					fechaCreacion = df.parse(c.getString(c.getColumnIndex("fecha_creacion")));
				} catch (ParseException e) {
					Log.e(getString(R.string.falloParseo), c.getString(c.getColumnIndex("fecha_creacion")));
				}
				Cursor ca = gM.getObjectWhere("aplicacion", columnsApli, "_id=" + c.getInt(c.getColumnIndex("aplicacion_id")));
				jornal = c.getLong(c.getColumnIndex("jornal"));
				horas = c.getLong(c.getColumnIndex("horas_hombre"));
				descripcion = getString(R.string.detalle_descripcion_label_personal, formateador.format(horas), formateador.format(jornal),
						(formateador.format(jornal * horas)));

				datos.add(new ItemsList(Integer.parseInt(c.getString(0)), UtilsGeneric.getImageAplicacion(ca.getInt(ca.getColumnIndex("aplicacion_tipo_id"))),
						dfMostrar.format(fechaCreacion), descripcion));

			} while (c.moveToNext());
		} else {
			datos.add(new ItemsList(0, R.drawable.ic_launcher, getString(R.string.noExisteHistorico), ""));
		}

		// cierro la conexion
		c.close();
		db.close();
		gM.close();
		gestorDB.close();

		lista = (ListView) findViewById(R.id.ListView_historico_personal);
		lista.setAdapter(new AdaptadorList(PersonalActivity.this, R.layout.list_item, datos) {
			@Override
			public void onEntrada(Object entrada, View view) {
				if (entrada != null) {
					TextView texto_id_item = (TextView) view.findViewById(R.id.texto_item_id);
					if (texto_id_item != null)
						texto_id_item.setText(((ItemsList) entrada).getId().toString());

					TextView texto_superior_entrada = (TextView) view.findViewById(R.id.list_item_titulo);
					if (texto_superior_entrada != null)
						texto_superior_entrada.setText(((ItemsList) entrada).getTextoTitulo());

					TextView texto_inferior_entrada = (TextView) view.findViewById(R.id.list_item_descripcion);
					if (texto_inferior_entrada != null)
						texto_inferior_entrada.setText(((ItemsList) entrada).getTextoDescripcion());

					TextView texto_fecha_entrada = (TextView) view.findViewById(R.id.list_item_fecha);
					if (texto_fecha_entrada != null)
						texto_fecha_entrada.setText("");

					ImageView imagen_entrada = (ImageView) view.findViewById(R.id.list_item_image);
					if (imagen_entrada != null)
						imagen_entrada.setImageResource(((ItemsList) entrada).getIdImagen());
				}
			}
		});

		lista.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> pariente, View view, int posicion, long id) {
				// ItemsList elegido = (ItemsList)
				// pariente.getItemAtPosition(posicion);

			}
		});

	}
	

	
	/**
	 * metodo de actuliar
	 * 
	 * @param nameTable
	 * @param reg
	 * @param _rowIndex
	 */
	private void update(String nameTable, ContentValues reg, Integer _rowIndex) {

		gestorDB = new GestorDB(this);
		SQLiteDatabase db = gestorDB.getWritableDatabase();

		gM = new GenericManager(db);

		gM.updateObject(nameTable, reg, _rowIndex);

		gM.close();
		db.close();
		gestorDB.close();

	}

}
